home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / wb / md1_8.lha / MultiDisplay / SrC / mdfonctions.c < prev    next >
C/C++ Source or Header  |  1997-09-06  |  9KB  |  344 lines

  1. /*
  2. **
  3. ** MULTI DISPLAY
  4. ** " Le vrai-faux viewer universel "
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #include <exec/types.h>
  11. #include <exec/memory.h>            /* AllocVec() */
  12. #include <exec/libraries.h>         /* struct Library */
  13. #include <utility/tagitem.h>        /* struct TagItem */
  14. #include <dos/dos.h>                /* BPTR */
  15. #include <dos/dostags.h>            /* Tags */
  16. #include <workbench/workbench.h>    /* struct DiskObject */
  17.  
  18. #include <libraries/locale.h>
  19.  
  20. #include <pragmas/dos_pragmas.h>
  21. #include <pragmas/exec_pragmas.h>
  22. #include <pragmas/locale_pragmas.h>
  23. #include <pragmas/icon_pragmas.h>
  24. #include <pragmas/datatypes_pragmas.h>
  25. #include <pragmas/iffparse_pragmas.h>
  26. #include <pragmas/reqtools_pragmas.h>
  27.  
  28. #include "md_strings.h"
  29.  
  30. /* Prototypes des fonctions */
  31. extern STRPTR ExamenDT(STRPTR name);
  32. extern BOOL RTInfo(STRPTR body);
  33.  
  34. extern struct Library *SysBase,*DOSBase;
  35. struct Library *WorkbenchBase,*LocaleBase,*IconBase,*DataTypesBase,*IFFParseBase,*ReqToolsBase;
  36.  
  37. extern BPTR source;                             /* Fichier de config */
  38. extern LONG position;                           /* Position initiale dans ce fichier */
  39. extern STRPTR def;                              /* Instruction par defaut */
  40. extern BOOL app,all,sync,show;                  /* Parametres */
  41. extern struct DiskObject *md_appicon;           /* AppIcon pour MD */
  42. struct LocaleInfo md_locale;                    /* Pour GetString() */
  43.  
  44. /* Ouvre toutes les librairies necessaires ainsi que le catalogue de MD */
  45. BOOL OuvrirLibrairies(void)
  46. {
  47.    struct TagItem LocaleItems[2];
  48.    BOOL result=TRUE;
  49.  
  50.    /* français est le langage par defaut , n'est ce pas ? */
  51.    LocaleItems[0].ti_Tag = OC_BuiltInLanguage;
  52.    LocaleItems[0].ti_Data = (ULONG)"français";
  53.    LocaleItems[1].ti_Tag = TAG_DONE;
  54.  
  55.    if( !(WorkbenchBase = OpenLibrary("workbench.library",39)) )
  56.       result = FALSE;
  57.    if( !(IconBase = OpenLibrary("icon.library",39)) )
  58.       result = FALSE;
  59.    if( LocaleBase = OpenLibrary("locale.library",38) )
  60.    {
  61.       md_locale.li_LocaleBase = (APTR)LocaleBase;
  62.       md_locale.li_Catalog = OpenCatalogA(NULL,"md.catalog",LocaleItems);
  63.    }
  64.    else result = FALSE;
  65.    if( !(DataTypesBase = OpenLibrary ("datatypes.library", 39)) )
  66.       result = FALSE;
  67.    if( !(IFFParseBase = OpenLibrary ("iffparse.library", 39)) )
  68.       result = FALSE;
  69.    if( !(ReqToolsBase = OpenLibrary("reqtools.library",38)) )
  70.       result = FALSE;
  71.    return result;
  72. }
  73.  
  74. /* Ferme toutes les librairies et le catalogue de MD */
  75. void FermerLibrairies(void)
  76. {
  77.    CloseLibrary(ReqToolsBase);
  78.    CloseLibrary(IFFParseBase);
  79.    CloseCatalog(md_locale.li_Catalog);
  80.    CloseLibrary(LocaleBase);
  81.    CloseLibrary(DataTypesBase);
  82.    CloseLibrary(IconBase);
  83.    CloseLibrary(WorkbenchBase);
  84. }
  85.  
  86. /* Fonction generee par 'CatComp md.cd CFILE md_strings.h'
  87.    On la met ici pour eviter les erreurs de definitions multiples */
  88. STRPTR GetString(struct LocaleInfo *li, LONG stringNum)
  89. {
  90.    LONG *l;
  91.    UWORD *w;
  92.    STRPTR builtIn;
  93.  
  94.    l = (LONG *)CatCompBlock;
  95.  
  96.    while( *l != stringNum )
  97.    {
  98.       w = (UWORD *)((ULONG)l + 4);
  99.       l = (LONG *)((ULONG)l + (ULONG)*w + 6);
  100.    }
  101.    builtIn = (STRPTR)((ULONG)l + 6);
  102.  
  103. #undef LocaleBase
  104. #define LocaleBase li->li_LocaleBase
  105.  
  106.     if( LocaleBase )
  107.        return GetCatalogStr(li->li_Catalog,stringNum,builtIn);
  108. #undef LocaleBase
  109.     return builtIn;
  110. }
  111.  
  112. /* Lit les tooltypes d'une icone
  113.    Si keep_icon vaut TRUE alors on conserve la structure DiskObject pour l'utiliser en appicon a
  114.    condition que le tooltype APPICON soit precise
  115.    Necessite icon.library */
  116. BOOL LectureIcone(STRPTR icon_name,BPTR icon_dir,BOOL keep_icon)
  117. {
  118.    struct DiskObject *icon;
  119.    BPTR old_dir;
  120.    BOOL result=TRUE;
  121.  
  122.    if( !icon_name )
  123.       return FALSE;
  124.    if( !icon_dir )
  125.    {
  126. #ifdef DEBUG
  127.       printf("Impossible de trouver le répértoire de MD (résident ?).\n");
  128. #endif
  129.       return FALSE;
  130.    }
  131.  
  132.    /* Si le repertoire n'est pas connu on ne pourra pas lire l'icone */
  133.    old_dir = CurrentDir(icon_dir);
  134.  
  135.    /* Avec GetDiskObjectNew() si l'icone n'existe pas on a celle par defaut du type correspondant */
  136.    if( keep_icon == FALSE )
  137.        icon = GetDiskObjectNew(icon_name);
  138.    else
  139.    {
  140.        /* On utilise l'icone courante pour l'appicon */
  141.        md_appicon = GetDiskObjectNew(icon_name);
  142.        icon = md_appicon;
  143.    }
  144.  
  145.    if( icon )
  146.    {
  147.       /* Recherche des tooltypes : FindToolType() cause un warning ! */
  148.       if( FindToolType(icon->do_ToolTypes,"APPICON") )
  149.       {
  150.          if( keep_icon == TRUE )
  151.          {
  152. #ifdef DEBUG
  153.             printf("Tooltype AppIcon activé...\n");
  154. #endif
  155.             app = TRUE;
  156.          }
  157.          else result = FALSE;
  158.       }
  159.       if( FindToolType(icon->do_ToolTypes,"ALL") )
  160.       {
  161. #ifdef DEBUG
  162.          printf("Tooltype All activé...\n");
  163. #endif
  164.          all = TRUE;
  165.       }
  166.       if( FindToolType(icon->do_ToolTypes,"SYNC") )
  167.       {
  168. #ifdef DEBUG
  169.          printf("Tooltype Sync activé...\n");
  170. #endif
  171.          sync = TRUE;
  172.       }
  173.       if( FindToolType(icon->do_ToolTypes,"SHOWDT") )
  174.       {
  175. #ifdef DEBUG
  176.          printf("Tooltype ShowDT (et donc Sync) activé...\n");
  177. #endif
  178.          show = TRUE;
  179.          sync = TRUE;
  180.       }
  181.       /* Liberation possible seulement si icon alloue et keep_icon faux ! */
  182.       if( keep_icon == FALSE )
  183.           FreeDiskObject(icon);
  184.    }
  185. #ifdef DEBUG
  186.    else
  187.    {
  188.          printf("Impossible d'ouvrir l'icône de %s.\n",icon_name);
  189.    }
  190. #endif
  191.  
  192.    CurrentDir(old_dir);
  193.    return result;
  194. }
  195.  
  196. /* Passe la commande adéquate au systéme */
  197. BOOL Commande(STRPTR commande,STRPTR arg)
  198. {
  199.    struct TagItem taglist[5];
  200.    BOOL result=TRUE;
  201.    int i=2;
  202.  
  203. #ifdef DEBUG
  204.    printf("Appel : %s\n",commande);
  205. #else
  206.    /* Teste si l argument existe */
  207.    if( arg != NULL )
  208.    {
  209.       /* Suppression de \0 a la fin de commande et " " necessaires */
  210.       commande[ strlen(commande)-1 ] = ' ';
  211.       sprintf(commande,"%s \"%s\"",commande,arg);
  212.    }
  213.  
  214.    /* Tags de System() */
  215.    taglist[0].ti_Tag = SYS_Input;
  216.    taglist[0].ti_Data = NULL;
  217.    taglist[1].ti_Tag = SYS_Output;
  218.    taglist[1].ti_Data = NULL;
  219.    if( sync == FALSE )
  220.    {
  221.       taglist[2].ti_Tag = SYS_Asynch;
  222.       taglist[2].ti_Data = TRUE;
  223.       i = 3;
  224.    }
  225.    taglist[i].ti_Tag = SYS_UserShell;
  226.    taglist[i].ti_Data = TRUE;
  227.    taglist[i+1].ti_Tag = TAG_DONE;
  228.    /* Passage de la commande */
  229.    if( SystemTagList(commande, taglist) == SYSTEMFAIL )
  230.       result = FALSE;
  231. #endif
  232.    return result;
  233. }
  234.  
  235. /* Compare le type decrit dans le fichier de config avec le nom
  236.    du datatype correspondant */
  237. BOOL ComparaisonID(STRPTR buffer,STRPTR id)
  238. {
  239.    BOOL arret=FALSE;
  240.    int i;
  241.  
  242.    buffer[ strlen(buffer)-1 ] = '\0';
  243.    if( stricmp( buffer,id ) == 0 )
  244.    {
  245.       arret = TRUE;
  246. #ifdef DEBUG
  247.       printf("ID : %s\n",buffer);
  248. #endif
  249.    }
  250.    return arret;
  251. }
  252.  
  253. /* Compare le type decrit dans le fichier de config avec le nom du fichier */
  254. BOOL ComparaisonNom(STRPTR buffer,STRPTR arg)
  255. {
  256.    BOOL arret=FALSE;
  257.    STRPTR arg2,buffer2;
  258.    int i;
  259.  
  260.    arg2 = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  261.    buffer2 = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  262.    if( (!arg2) || (!buffer2) )
  263.       exit(1);
  264.  
  265.    for(i=0;i<strlen( arg );i++)
  266.       arg2[i] = tolower(arg[i]);
  267.    arg2[i] = '\0';
  268.    for(i=0;i<strlen( buffer );i++)
  269.       buffer2[i] = tolower(buffer[i+1]);
  270.    /* Suppression du caractere '\n' obtenu a la lecture */
  271.    buffer2[ strlen(buffer2)-1 ] = '\0';
  272.  
  273.    if( strstr( arg2,buffer2 ) )
  274.    {
  275.       arret = TRUE;
  276. #ifdef DEBUG
  277.       printf("Nom : %s\n",buffer2);
  278. #endif
  279.    }
  280.    FreeVec(arg2);
  281.    FreeVec(buffer2);
  282.    return arret;
  283. }
  284.  
  285. /* Recherche quel est le type du fichier passe en argument en comparant le fichier
  286.    de config et le retour de ExamenDT() */
  287. BOOL Recherche(STRPTR arg)
  288. {
  289.    BOOL stop=FALSE,comp=TRUE,result=TRUE;
  290.    STRPTR buffer,id;
  291.  
  292.    buffer = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  293.    if( !buffer )
  294.       exit(1);
  295.  
  296.    /* Identification du datatype du fichier */
  297.    id = ExamenDT(arg);
  298.    if( !id )
  299.    {
  300.       sprintf(buffer,GetString(&md_locale,MSG_UNKNOWNID),arg);
  301.       RTInfo(buffer);
  302.       result = Commande(def,arg);
  303.       FreeVec(buffer);
  304.       return result;
  305.    }
  306.    if( show == TRUE )
  307.    {
  308.       sprintf(buffer,GetString(&md_locale,MSG_SHOWID),arg,id);
  309.       RTInfo(buffer);
  310.    }
  311.  
  312.    /* Stop est VRAI si la boucle doit être arrêtée et donc si Commande()
  313.       doit etre appellée. Sinon on utilise l'instruction par défaut */
  314.    while( (FGets(source,buffer,MAX_BUFFER)) && (stop == FALSE) )
  315.    {
  316.       /* comp est vrai si la ligne du fichier est un type de donnees */
  317.       if( comp == TRUE )
  318.       {
  319.          /* Teste s'il s'agit d'un datatype ou d'une extension de nom de fichier */
  320.          if( buffer[0] != '#' )
  321.             stop = ComparaisonID(buffer,id);
  322.          else
  323.             stop = ComparaisonNom(buffer,arg);
  324.          comp = FALSE;
  325.       }
  326.       else comp = TRUE;
  327.    }
  328.  
  329.    /* Stop est VRAI or la ligne suivant le type de donnée valide a été lue dans le while()
  330.       precédent : on se sert donc de buffer pour appeller Commande() */
  331.    if( stop == TRUE )
  332.       result = Commande(buffer,arg);
  333.    else result = Commande(def,arg);
  334.  
  335. #ifdef DEBUG
  336.    if( result == FALSE )
  337.       printf("Echec sur %s ...\n",arg);
  338. #endif
  339.    /* Retour au début du fichier */
  340.    Seek(source,position,OFFSET_BEGINNING);
  341.    FreeVec(buffer);
  342.    return result;
  343. }
  344.